'''
Description: 
Author: Zilu
Date: 2021-11-07 15:59:29
Version: 
LastEditTime: 2021-11-07 16:46:08
LastEditors: Zilu
'''

# 我们可以给一个类动态地绑定属性和方法
class Student(object):
    pass

def set_age(self, age):
    self.age = age

s = Student()
from types import MethodType
s.set_age = MethodType(set_age, s)
s.set_age(25)
print(s.age)

# 这种方式只能对单个实例生效
# 可以给类绑定方法，这样所有的实例都可以使用
Student.set_age = set_age
s1 = Student()
s1.set_age(12)
s1.age

# 可以使用__slots__关键字限制绑定的属性
class MyObj(object):
    __slots__ = ('attr1','attr2')

myObj = MyObj()
myObj.attr1 = 'abc'
myObj.age = 25      # 使用错误

# __slots__ 属性对子类不起作用，仅对当前类的实例起作用
class MyObj2(MyObj):
    pass

myObj2 = MyObj2()
myObj2.age = 25
myObj2.age

# 除非在子类中也定义__slots__，这样，子类实例允许定义的属性就是自身的__slots__加上父类的__slots__

